/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package Controller;

import Model.Celdam;
import Model.DatosPotencia;
import Model.twoWays;
import java.io.*;
import java.util.ArrayList;
import java.util.logging.Level;
import java.util.logging.Logger;

/**
 *
 * @author Jhonatan
 */
public class Archivos {

    public static void leerArchivo(String ruta) {
        File archivo = null;
        FileReader fr = null;
        BufferedReader br = null;

        try {
            // Apertura del fichero y creacion de BufferedReader para poder
            // hacer una lectura comoda (disponer del metodo readLine()).
            archivo = new File(ruta);
            fr = new FileReader(archivo);
            br = new BufferedReader(fr);

            // Lectura del fichero
            String linea, taos = "", betas;
            String datos[];
            String celda[];
            MatrizDatos matrizDatos = new MatrizDatos();
            double num = 0;
            ArrayList<Double> valores = new ArrayList<Double>();
            Celdam celdam = new Celdam();
            int count = 0, posX = 0, posY = 0;
            while ((linea = br.readLine()) != null) {
                if (count == 0) {
                    datos = linea.split(",");
                    MainController.crearNuevaMatriz(Integer.parseInt(datos[1]), Integer.parseInt(datos[2]),
                            Double.valueOf(datos[3]), Double.valueOf(datos[4]), Double.valueOf(datos[5]),
                            Double.valueOf(datos[6]), Double.valueOf(datos[7]), Double.valueOf(datos[8]),
                            Double.valueOf(datos[9]), "Archivo", Integer.parseInt(datos[10]),
                            Integer.parseInt(datos[11]), Integer.parseInt(datos[12]));
                }
                if (count == 1) {
                    taos = linea;
                }
                if (count == 2) {
                    betas = linea;
                    MainController.validarTaosYBetas(taos, betas);
                }
                if (count > 2) {
                    celda = linea.split(",");
                    celdam.setDatos(Integer.parseInt(celda[0]));
                    celdam.setLambda1(Double.valueOf(celda[1]));
                    celdam.setLambda2(Double.valueOf(celda[2]));
                    celdam.setLambda3(Double.valueOf(celda[3]));
                    celdam.setLambda4(Double.valueOf(celda[4]));
                    Calculadora c = new Calculadora();
                    valores.clear();
                    for (int j = 0; j < celdam.getDatos(); j++) {
                        num = c.generarDatos(twoWays.getGranMedia(), twoWays.getBeta(), twoWays.getI() - 1, twoWays.getJ() - 1, celdam.getLambda1(), celdam.getLambda2(), celdam.getLambda3(), celdam.getLambda4());
                        valores.add(num);
                    }
                    celdam.setValores(valores);
                    matrizDatos.agregarDato(celdam, posX, posY, twoWays.getI(), twoWays.getJ());

                    posY++;
                    if (posY > twoWays.getJ() - 1) {
                        posY = 0;
                        posX++;
                    }
                }
                System.out.println(linea);
                count++;
            }
            Archivos archivos = new Archivos();
            archivos.simulacion();
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            try {
                if (null != fr) {
                    fr.close();
                }
            } catch (Exception e2) {
                e2.printStackTrace();
            }
        }
    }
    public static void escrituraArchivos(String texto){
        FileWriter TextOut = null;
        texto= texto + " \n";
        try {
            File TextFile = new File(twoWays.getRutaSalida());
            TextOut = new FileWriter(TextFile, true);
            TextOut.write(texto);
            TextOut.close();
        }
        //          FileWriter fichero = null;
        //        PrintWriter pw = null;
        //        try
        //        {
        //            fichero = new FileWriter(twoWays.getRutaSalida());
        //            pw = new PrintWriter(fichero);
        //
        //
        //                pw.println(twoWays.getArchivo());
        //
        //        } catch (Exception e) {
        //            e.printStackTrace();
        //        } finally {
        //           try {
        //           // Nuevamente aprovechamos el finally para
        //           // asegurarnos que se cierra el fichero.
        //           if (null != fichero)
        //              fichero.close();
        //           } catch (Exception e2) {
        //              e2.printStackTrace();
        //           }
        catch (IOException ex) {
            Logger.getLogger(Archivos.class.getName()).log(Level.SEVERE, null, ex);
        } finally {
            try {
                TextOut.close();
            } catch (IOException ex) {
                Logger.getLogger(Archivos.class.getName()).log(Level.SEVERE, null, ex);
            }
        }
        }
//          FileWriter fichero = null;
//        PrintWriter pw = null;
//        try
//        {
//            fichero = new FileWriter(twoWays.getRutaSalida());
//            pw = new PrintWriter(fichero);
//
//            
//                pw.println(twoWays.getArchivo());
//
//        } catch (Exception e) {
//            e.printStackTrace();
//        } finally {
//           try {
//           // Nuevamente aprovechamos el finally para 
//           // asegurarnos que se cierra el fichero.
//           if (null != fichero)
//              fichero.close();
//           } catch (Exception e2) {
//              e2.printStackTrace();
//           }
//        }
//    }
    public ArrayList<Double> Ks = new ArrayList<Double>();

    public void simulacion() {
//        FileWriter fichero = null;
//        PrintWriter pw = null;
//        try {
//            fichero = new FileWriter(twoWays.getRutaSalida());
//            pw = new PrintWriter(fichero);
//            twoWays.setPw(pw);
//        } catch (Exception e) {
//        }        
            String e ="";
            for (int x = 0; x < twoWays.getmPiloto(); x++) {
                MatrizDatos matriz = new MatrizDatos();
                matriz.ordenamientoSecuencia();
                e = "Varianza: " + twoWays.getVarianza() + " Error: " + twoWays.getError() + " Significancia: " + twoWays.getSignificancia() + " M estimado: " + twoWays.getmEstimado();
                System.out.println(e);
//                twoWays.setArchivo(twoWays.getArchivo()+" \n"+e);
                escrituraArchivos(e);
                int filas = twoWays.getMatriz().length;
                int columnas = twoWays.getMatriz()[0].length;
                for (int i = 0; i < filas; i++) {
                    for (int j = 0; j < columnas; j++) {
                        System.out.println("Número de datos: " + twoWays.getMatriz()[i][j].getDatos() + " Fila: " + i + " Columna: " + j + " lambda1: " + twoWays.getMatriz()[i][j].getLambda1() + " lambda2: " + twoWays.getMatriz()[i][j].getLambda2() + " lambda3: " + twoWays.getMatriz()[i][j].getLambda3() + " lambda4: " + twoWays.getMatriz()[i][j].getLambda4());
                        for (int k = 0; k < twoWays.getMatriz()[i][j].getDatos(); k++) {
                            System.out.println(twoWays.getMatriz()[i][j].getValores().get(k));                        
                        }
                        System.out.println("-----------------------");
                    }
                }
                double KGeneralizada = 0;
                //MainController.simular();
                Calculadora c = new Calculadora();
                KGeneralizada = c.Kgeneralizada();
                Ks.add(KGeneralizada);
                e = "La K Generalizada linda es: " + KGeneralizada;
                System.out.println(e);
//                twoWays.setArchivo(twoWays.getArchivo()+" \n"+e);
                Archivos.escrituraArchivos(e);
                e = "La K askldjaskldjasd: " + c.estadisticaFriedman(5, filas, columnas);
                System.out.println(e);
//                twoWays.setArchivo(twoWays.getArchivo()+" \n"+e);
                Archivos.escrituraArchivos(e);
                KGeneralizada = 0;
                MainController.reRegenerarDatos();
            }
            MainController.generarLambdas(Ks);
            PotenciaControl.calcularPotencia(MainController.puntoCritico, twoWays.getmEstimado());
            for (int i = 0; i < DatosPotencia.getValoresDeltaTao().size(); i++) {
                e = "Tao = " + DatosPotencia.getValoresDeltaTao().get(i) + " Potencia = " + DatosPotencia.getValoresPotencia().get(i);
                System.out.println(e);
//                twoWays.setArchivo(twoWays.getArchivo()+" \n"+e);
                Archivos.escrituraArchivos(e);
            }
//            try {
//           if (null != fichero)
//              fichero.close();
//           } catch (Exception e2) {
//              e2.printStackTrace();
//           }
//            escrituraArchivos();
        }
}
